const fs = require("fs")
const esprima = require("esprima")
const estraverse = require("estraverse")
const escodegen = require("escodegen")
const iconv = require("iconv-lite")
const es_tool = require("../../tools/es_ast_tool")
const akamai_base = require("../common/akamai_base")
const babel_tool = require('../../tools/babel_ast_tool');
const base_tool =  require('../../tools/base_ast_tools');

// var ast = base_ast.get_ast_by_file("./DtPXZSxIUm/DtPXZSxIUm.js");
// var ast = base_ast.get_ast_by_file("./IVQtHycNnW/IVQtHycNnW.js");
// var ast = base_ast.get_ast_by_file("./srQMvqHhWp/srQMvqHhWp.js");
// var ast = base_ast.get_ast_by_file("./zUEPLXSXxF/src.js");
// var ast = base_ast.get_ast_by_file("./HkccfgNBOV/src.js");
var base_path = "./BUUTkIyZtB";
var ast = es_tool.get_ast_by_file(base_path+"/src.js");
// var ast = es_tool.get_ast_by_file(base_path+"/cc.js");
// var enc_obj = "KH"; //HkccfgNBOV加密混淆字符串函数名
var enc_obj = "XX"; //AOIRpwGNMr加密混淆字符串函数名

// base_ast.rename_all_var(ast);
// es_tool.check_vars(ast);
// es_tool.sequence_split(ast);
// base_tool.renameAllFuncParams(ast);
// es_tool.save_ast_to_file(ast, base_path+"/1.js");


// 二元运算符 计算并返回变量map
var biary_maps = akamai_base.get_binary_func_vars(ast);
console.log(biary_maps);
// 将变量替换成实际值
es_tool.identifier_tool(ast, biary_maps);
// 处理常量计算
es_tool.binary_tool(ast);
// 删除无用的变量
// base_ast.delete_vars(ast, biary_maps);
// 获取固定的常量值
var local_vars = akamai_base.get_literal_vals(ast);
console.log("local_vars:",local_vars);
// 继续 将变量替换成实际值
es_tool.identifier_tool(ast, local_vars);
// 处理常量计算
es_tool.binary_tool(ast);
// 删除无用的变量
es_tool.delete_vars(ast, local_vars); // 替换完了变量就删除
// 处理switch case语句
akamai_base.find_switch_case_for(ast);
// 获取巨长的变量定义
var def_code = akamai_base.get_vars_def(ast, 600, 2000);
// 将这些变量初始化的地方找到并执行，执行完获取到map保存
var var_dict = es_tool.identifier_tool2(ast, def_code)
// 继续 将变量替换成实际值
es_tool.identifier_tool(ast, var_dict);
// 替换完了变量就删除
es_tool.delete_vars(ast, var_dict);
// 逗号表达式拆分
es_tool.sequence_split(ast);
// 简单函数重命名
es_tool.rechange_funcname(ast);
// 根据解密函数插入一些hook代码
akamai_base.insert_hook_destr(ast, enc_obj);
// 查找sensor_arr 并插入 打印解密字符串map 代码
var var_maps = akamai_base.find_andhook_sensor_arr(ast);
// 重命名
es_tool.rename_vars(ast, var_maps);
// 对常量值进行重命名
var const_maps = es_tool.ConstReturn(ast);
// 输出map对象
es_tool.MapStr(const_maps);
// 重命名
es_tool.rename_vars(ast, const_maps);

es_tool.save_ast_to_file(ast, "./DtPXZSxIUm/1.js");
// base_ast.save_ast_to_file(ast, "./zUEPLXSXxF/1.js");
// base_ast.save_ast_to_file(ast, base_path+"/1.js");



